package com.hsylient.javase.chapter10;

import cn.hutool.core.util.StrUtil;
import com.hsylient.javase.common.entity.Student;
import com.hsylient.javase.common.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.Locale;
import java.util.Objects;
import java.util.Optional;

@Slf4j
public class OptionalTest {


    @Test
    @SuppressWarnings("all") // 因为idea知道user是null有提示，这里警告压制一下
    public void testOrElse() {
        User user = null;
        // 我现在就想取出来User对象里边的name值然后转大写，常规的方式我们需要判空
        if (Objects.nonNull(user) && Objects.nonNull(user.getName())) {
            String name = user.getName().toLowerCase(Locale.ROOT);
            log.info("[使用老方法判断] 不为空的情况下 打印用户名 {}", name);
        } else {
            log.info("[使用老方法判断] 为空的情况下 打印用户名 {}", "");
        }

        // 如果user是null或者取出来的name是null，那么就直接走到orElse的部分的代码了，而不会走到map的部分这样就能避免在map处理逻辑的过程出现空指针异常
        // 如果不是null那么直接取出来用
        String userName = Optional.ofNullable(user).map(item -> item.getName().toUpperCase(Locale.ROOT)).orElse(StrUtil.EMPTY);
        log.info("[测试Optional是怎么避免空指针的] {}", userName);
    }


    @Test
    public void testOptionalIfPresent() {
        Student student = new Student();
        student.setAge(11);
        student.setName("hsylient");
        Optional.ofNullable(student.getAge()).ifPresent(item -> student.setName(null));
        log.info("[如果Age不是空就将Name制空] {}", student);
    }


    @Test
    public void testIfPresentOrElse() {
        Student student = new Student();
//        student.setAge(11);
        student.setName("hsylient");
        Optional.ofNullable(student.getAge()).ifPresentOrElse(item -> log.info("[测试IfPresentOrElse] Age存在 age={}", item),
                () -> {
                    // 如果Age不存在，注意这里虽然使用了Runnable接口，但是不会开启新的线程，因为ifPresentOrElse()方法里边调用的是run方法而不是start方法
                    log.info("[测试IfPresentOrElse] Age不存在");
                });
    }
}
